15. hash(哈希)

- https://baike.baidu.com/item/Hash/390310?fr=aladdin
- 关键词
    - 任意长度输入
    - 固定长度输出
- 特征
    - 理论上输入跟输出并不是一对一
    - 实际使用假定不会出现碰撞或者冲突
    
- 常用算法
    - MD4
    - MD5
    - SHA-1
   
- 应用场景
    - 数字签名
    - 文件校验
    
    
# 哈希表
- 是根据关键码值(Key value)而直接进行访问的数据结构
- 常用算法
    - 直接寻址
    - 数字分析
    - 平方取中
    - 折叠法
    - 随机数
    - 除留余数法
 - 冲突处理
    - 链地址法
    - 建立公共溢出区
    - 再散列
    
- 性能
    - 散列函数是否均匀
    - 冲突处理   

# 密码存储
- 明文vs密文
    - 明文:可直接读懂含义
    - 密文:不可直接读懂
- hash密码
    - 防止密码泄露
    - 不能防备字典攻击
- 加盐
    - 防备字典攻击
- python代码示例

            # 导入模块
            import hashlib
            # 使用MD5作为散列算法
            m = hashlib.md5()
            # 把值放入散列
            m.update(bytes(request.POST['password'], encoding="utf8"))
            # 生成相应的md5值
            ob.password = m.hexdigest()